package modelo;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import modelo.enums.Tarifa;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "factura")
@NamedQueries({
        @NamedQuery(name = Factura.RECUPERA_TODAS, query = "SELECT f FROM Factura f"),
        @NamedQuery(name = Factura.RECUPERA_TODAS_POR_NIF, query = "SELECT f FROM Factura f WHERE f.nif = :nif"),
        @NamedQuery(name = Factura.RECUPERA_TODAS_POR_METROS, query = "SELECT f FROM Factura f WHERE f.metros >= :metrosDesde AND f.metros <= :metrosHasta"),
        @NamedQuery(name = Factura.RECUPERA_TODAS_POR_CODIGO, query = "SELECT f FROM Factura f WHERE f.codigo = :codigo"),
        @NamedQuery(name = Factura.RECUPERA_TODAS_POR_METROS_Y_NIF, query = "SELECT f FROM Factura f WHERE f.metros >= :metrosDesde AND f.metros <= :metrosHasta AND f.nif = :nif"),
        @NamedQuery(name = Factura.RECUPERA_TODAS_POR_NIF_Y_CODIGO, query = "SELECT f FROM Factura f WHERE f.nif = :nif AND f.codigo = :codigo") })
public class Factura
{
    public static final String RECUPERA_TODAS = "Recupera todas las facturas";
    public static final String RECUPERA_TODAS_POR_NIF = "Recupera todas las facturas por NIF";
    public static final String RECUPERA_TODAS_POR_METROS = "Recupera todas las facturas por metros";
    public static final String RECUPERA_TODAS_POR_CODIGO = "Recupera todas las facturas por codigo";
    public static final String RECUPERA_TODAS_POR_METROS_Y_NIF = "Recupera todas las facturas por metros y NIF";
    public static final String RECUPERA_TODAS_POR_NIF_Y_CODIGO = "Recupera todas las facturas por NIF y codigo";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private int codigo;
    private int metros;
    @Enumerated
    private Tarifa tarifa;
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecha;
    private String periodo;
    private String nif;

    public Factura()
    {
        super();
    }

    public Factura(int codigo, int metros, Tarifa tarifa, Date fecha, String periodo, String nif)
    {
        super();
        this.codigo = codigo;
        this.metros = metros;
        this.tarifa = tarifa;
        this.fecha = fecha;
        this.periodo = periodo;
        this.nif = nif;
    }

    public int getCodigo()
    {
        return codigo;
    }

    public void setCodigo(int codigo)
    {
        this.codigo = codigo;
    }

    public int getMetros()
    {
        return metros;
    }

    public void setMetros(int metros)
    {
        this.metros = metros;
    }

    public Tarifa getTarifa()
    {
        return tarifa;
    }

    public void setTarifa(Tarifa tarifa)
    {
        this.tarifa = tarifa;
    }

    public Date getFecha()
    {
        return fecha;
    }

    public void setFecha(Date fecha)
    {
        this.fecha = fecha;
    }

    public String getPeriodo()
    {
        return periodo;
    }

    public void setPeriodo(String periodo)
    {
        this.periodo = periodo;
    }

    public String getNif()
    {
        return nif;
    }

    public void setNif(String nif)
    {
        this.nif = nif;
    }

    public void actualiza(Factura factura)
    {
        this.setCodigo(factura.getCodigo());
        this.setMetros(factura.getMetros());
        this.setTarifa(factura.getTarifa());
        this.setFecha(factura.getFecha());
        this.setPeriodo(factura.getPeriodo());
        this.setNif(factura.getNif());
    }

    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + codigo;
        result = prime * result + ((fecha == null) ? 0 : fecha.hashCode());
        result = prime * result + metros;
        result = prime * result + ((periodo == null) ? 0 : periodo.hashCode());
        result = prime * result + ((tarifa == null) ? 0 : tarifa.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Factura other = (Factura) obj;
        if (codigo != other.codigo)
            return false;
        if (fecha == null)
        {
            if (other.fecha != null)
                return false;
        }
        else if (!fecha.equals(other.fecha))
            return false;
        if (metros != other.metros)
            return false;
        if (periodo == null)
        {
            if (other.periodo != null)
                return false;
        }
        else if (!periodo.equals(other.periodo))
            return false;
        if (tarifa != other.tarifa)
            return false;
        return true;
    }

}
